﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Abarcos.LogicaNegocios
{
    class Puerto
    {
        int entro, salio;
        int b = 1;
        int IdBarco = 1;
        int resAnterior = 0;
        int cantidadB;       //obtengo la cantidad de barcos que el usuario ingreso y lo alamaceno en una variable
        private static int cantidadPuerto; //declaro la variable cantidad de puertos
        private static List<string> informacion = new List<string>();

        //constructor que inicializa la cantidad de puertos
        public Puerto(int CANTIDADp,int CANTIDADb)
        {
            cantidadPuerto = CANTIDADp;
            this.cantidadB=CANTIDADb;
        }

        //metodo que realiza y alamacena el resultado final de todos los barcos
        public void OperacionPuertos()
        {
            int[] puerto = new int[cantidadPuerto];
            //lleno los puertos con 0
            for (int p = 0; p < puerto.Length; p++)
            {
                puerto[p] = 0;
            }

            while (cantidadB >0) //el ciclo se repite hasta que ya no queden barcos
            {
                //compruebo si el numero de puertos es mayor que barcos si es asi redusco los puertos a la cantidad de barcos
                if (cantidadB < cantidadPuerto)
                {
                    b = cantidadPuerto - cantidadB;
                }
                else
                {
                    b = 1;
                }
                while (b <=cantidadPuerto) //el ciclo "hace pasar" a los primeros barcos,segun la cantidad de puertos disponibles 
                {
                    Container.llenarContainer(IdBarco); //llama al metodo de la clase "container" para llenar la carga que trae el barco
                    int container = Container.pilaB.Count; //cuenta la cantidad de carga del barco
                    int res = encontrarMinimo(puerto);
                    resAnterior = puerto[res];
                    puerto[res] = puerto[res] + b;
                    entro = puerto[res]; //almaceno el resultado de entrada del barco en la variable "entro"
                    puerto[res] = puerto[res] + (container + 1);//sumo lo que ya tiene el arreglo en la pocision "res" mas la cantidad de container que tiene el barco mas 1 (1 es la cantidad que demora en salir)
                    string barco = Program.DesencolarBarcos();//saco de la cola el barco
                    Container.DescargarContainer();// descargo los container
                    salio = puerto[res]; //almaceno el resultado de salida
                    b++;
                    cantidadB--; //redusco la cantidad de barcos
                    informacion.Add("El Barco " + IdBarco + " entro en " + entro + " salio  en " + salio);//almaceno la informacion final
                    IdBarco++;
                    if (cantidadB == 0)
                    {
                        break;
                    }
                }
              
            }
        }


        //metodo para encontrar el valor minimo del arreglo y retornar su posicion
          public static int encontrarMinimo(int[] arr)
        {
            int vm = arr.Min();
            int resultado = 0;
            for (int i = 0; i < arr.Length; i++)
            {
                if (vm < arr[i])
                {
                    continue;
                }
                else
                {
                    resultado = i;
                    break;
                }
            }
            return resultado;
        }

        //solo retorna la informacion de todos los barcos
        public static List<string> RetornaInformacion()
        {
          
            return informacion;
        }

        public static bool comprobar(int []arr,int numero){
            foreach (var i in arr)
            {
                if (i == numero)
                {
                    return true;
                }
            }
            return false;

        }


    }
  }

